Hibernate Annotations

Java Technologies - হাইবারনেট (Hibernate)
150
150

Hibernate Annotations হল Hibernate ORM ফ্রেমওয়ার্কে Java Persistence API (JPA) এর অ্যানোটেশনগুলির একটি সেট, যা ডেটাবেস টেবিলের সাথে Java ক্লাস এবং তাদের প্রপার্টি ম্যানেজ করতে ব্যবহৃত হয়। Hibernate-এ অ্যানোটেশন ব্যবহার করে আপনার কোড আরও ক্লিন এবং মেইনটেইনেবল হয়, কারণ আপনি XML কনফিগারেশন ফাইলের পরিবর্তে কোডে অ্যানোটেশন দিয়ে কনফিগারেশন করতে পারেন।

Hibernate অ্যানোটেশন ব্যবহার করে আপনি Entity ক্লাস তৈরি করতে পারেন এবং তার Primary Key, Relationships, Columns, Table Names, এবং আরও অনেক কনফিগারেশন ডেটাবেস টেবিলের সাথে ম্যাপ করতে পারেন।

এখানে Hibernate অ্যানোটেশনগুলি ব্যবহার করার পদ্ধতি এবং বিভিন্ন অ্যানোটেশন কীভাবে কাজ করে তা বিস্তারিতভাবে আলোচনা করা হবে।


1. Hibernate Entity Class

Hibernate-এ একটি Entity হল এমন একটি ক্লাস যা ডেটাবেস টেবিলের সাথে সম্পর্কিত। @Entity অ্যানোটেশন দিয়ে এটি চিহ্নিত করা হয়। ক্লাসের একটি প্রপার্টি সাধারণত Primary Key হিসেবে কাজ করে, এবং @Id অ্যানোটেশন দিয়ে তা চিহ্নিত করা হয়।

Basic Example of Hibernate Entity Class

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "student")  // Maps the Student class to the "student" table
public class Student {

    @Id  // Primary Key for the student
    private int id;

    private String name;
    private String course;

    // Constructors, Getters and Setters
    public Student() { }

    public Student(String name, String course) {
        this.name = name;
        this.course = course;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCourse() {
        return course;
    }

    public void setCourse(String course) {
        this.course = course;
    }
}

Explanation:

  • @Entity: এটি Hibernate কে বলে দেয় যে এই ক্লাসটি একটি Entity এবং এটি ডেটাবেস টেবিলের সাথে সম্পর্কিত।
  • @Id: এটি ক্লাসের ফিল্ডকে Primary Key হিসেবে চিহ্নিত করে।
  • @Table: এটি ডেটাবেস টেবিলের নাম নির্ধারণ করে। (যদি টেবিলের নাম ডিফল্ট নামের সাথে মেলে না তবে এটি প্রয়োজনীয় হয়)

2. Hibernate Column Mapping

Hibernate-এ অ্যানোটেশন ব্যবহার করে টেবিলের কলামগুলির সাথে Java Bean প্রপার্টির mapping করা হয়। @Column অ্যানোটেশনটি ব্যবহার করে আপনি কোন প্রপার্টি কোন কলামের সাথে ম্যাপ হবে তা নির্ধারণ করতে পারেন।

Example of Column Mapping:

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "student")
public class Student {

    @Id
    private int id;

    @Column(name = "student_name")  // Maps the name field to the "student_name" column
    private String name;

    @Column(name = "course_name")  // Maps the course field to the "course_name" column
    private String course;

    // Constructors, Getters and Setters
}

Explanation:

  • @Column: এটি প্রপার্টিকে নির্দিষ্ট কলামের সাথে ম্যাপ করার জন্য ব্যবহৃত হয়। আপনি name অ্যাট্রিবিউট ব্যবহার করে কলামের নাম নির্ধারণ করতে পারেন।

3. Hibernate Relationship Mapping

Hibernate-এ সম্পর্কযুক্ত টেবিলের মধ্যে One-to-One, One-to-Many, Many-to-One, এবং Many-to-Many সম্পর্কের জন্য বিভিন্ন অ্যানোটেশন রয়েছে। নিচে বিভিন্ন সম্পর্কের অ্যানোটেশন ব্যাখ্যা করা হলো।

a) One-to-One Relationship

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;

@Entity
public class Student {

    @Id
    private int id;

    private String name;

    @OneToOne
    private Address address;  // One-to-One relationship with Address

    // Getters and Setters
}

b) One-to-Many Relationship

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;

@Entity
public class Course {

    @Id
    private int id;

    private String courseName;

    @OneToMany(mappedBy = "course")  // One-to-Many relationship with Student
    private List<Student> students;

    // Getters and Setters
}

c) Many-to-One Relationship

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

@Entity
public class Student {

    @Id
    private int id;

    private String name;

    @ManyToOne
    private Course course;  // Many-to-One relationship with Course

    // Getters and Setters
}

d) Many-to-Many Relationship

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;

@Entity
public class Student {

    @Id
    private int id;

    private String name;

    @ManyToMany
    private List<Course> courses;  // Many-to-Many relationship with Course

    // Getters and Setters
}

Explanation:

  • @OneToOne: One-to-One সম্পর্ক নির্দেশ করে, যেখানে একটি টেবিলের এক রেকর্ড আরেকটি টেবিলের এক রেকর্ডের সাথে সম্পর্কিত থাকে।
  • @OneToMany: One-to-Many সম্পর্ক নির্দেশ করে, যেখানে একটি রেকর্ড অনেক রেকর্ডের সাথে সম্পর্কিত থাকে।
  • @ManyToOne: Many-to-One সম্পর্ক নির্দেশ করে, যেখানে অনেক রেকর্ড একটি রেকর্ডের সাথে সম্পর্কিত থাকে।
  • @ManyToMany: Many-to-Many সম্পর্ক নির্দেশ করে, যেখানে অনেক রেকর্ড অনেক রেকর্ডের সাথে সম্পর্কিত থাকে।

4. Hibernate Generation Strategy for Primary Key

Hibernate-এ Primary Key এর জন্য বিভিন্ন generation strategies ব্যবহার করা যায়, যেমন AUTO, IDENTITY, SEQUENCE, এবং TABLE

Primary Key Generation Example:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Student {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)  // Auto-generated Primary Key
    private int id;

    private String name;
    private String course;

    // Getters and Setters
}

Generation Strategies:

  • GenerationType.IDENTITY: ডেটাবেসে ইনক্রিমেন্টাল ভ্যালু ব্যবহার করে auto-increment প্রপার্টি।
  • GenerationType.SEQUENCE: ডেটাবেসে sequence ব্যবহার করে প্রাথমিক কী তৈরি করা হয়।
  • GenerationType.TABLE: একটি টেবিল ব্যবহার করে প্রাথমিক কী তৈরি করা হয় (কম ব্যবহৃত)।
  • GenerationType.AUTO: Hibernate ডেটাবেস ডায়ালেক্ট অনুযায়ী সঠিক স্ট্র্যাটেজি নির্বাচন করবে।

5. Hibernate Fetching Strategies

Hibernate সম্পর্কিত ডেটা (যেমন একাধিক সম্পর্কিত অবজেক্ট) রিট্রিভ করতে fetching strategies ব্যবহার করা হয়। প্রধান দুটি স্ট্র্যাটেজি হল:

  1. Eager Fetching: যখন সম্পর্কিত অবজেক্ট এক্সেস করার সাথে সাথে লোড হয়। এটি fetch = FetchType.EAGER অ্যানোটেশনের মাধ্যমে নির্ধারণ করা হয়।
  2. Lazy Fetching: যখন সম্পর্কিত অবজেক্ট কেবল তখনই লোড হয় যখন তাকে এক্সেস করা হয়। এটি fetch = FetchType.LAZY অ্যানোটেশনের মাধ্যমে নির্ধারণ করা হয়।

Fetching Strategy Example:

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.OneToMany;

@Entity
public class Course {

    @Id
    private int id;

    private String courseName;

    @OneToMany(fetch = FetchType.LAZY)  // Lazy loading strategy
    private List<Student> students;

    // Getters and Setters
}

Explanation:

  • FetchType.LAZY: লেজি লোডিং, অর্থাৎ সম্পর্কিত ডেটা কেবল তখনই লোড হবে যখন তা এক্সেস করা হবে।
  • FetchType.EAGER: এগার লোডিং, অর্থাৎ সম্পর্কিত ডেটা সেশন লোড হওয়ার সময়েই লোড হয়ে যাবে।

Hibernate Annotations একটি শক্তিশালী এবং সহজ উপায় Hibernate ORM এর সাথে কাজ করার জন্য। এটি Entity Class Mapping, Relationship Mapping, Primary Key Generation, Fetching Strategies, এবং অন্যান্য ডেটাবেস কনফিগারেশন সম্পাদন করতে সাহায্য করে। Annotations ব্যবহারের মাধ্যমে আপনার কোড আরও সহজ, পরিষ্কার এবং রক্ষণাবেক্ষণযোগ্য হয়।

Content added By

Hibernate Annotations কি এবং কেন প্রয়োজন?

134
134

Hibernate Annotations হল একটি শক্তিশালী বৈশিষ্ট্য যা Hibernate ORM ফ্রেমওয়ার্কে Java classes এবং databases টেবিলের মধ্যে সম্পর্ক তৈরি করার জন্য ব্যবহৃত হয়। Hibernate annotations হল metadata বা মেটাডেটা ডিফিনিশন যা Hibernate কে জানায় যে একটি Java ক্লাস বা ফিল্ড কীভাবে একটি ডাটাবেস টেবিল বা কলামের সাথে সম্পর্কিত হবে।

Hibernate আগের সময়ে XML-based configuration ব্যবহার করত, তবে এখন annotations ব্যবহার করে কোডের মধ্যে সরাসরি metadata নির্ধারণ করা যায়, যা কোডকে আরও পরিষ্কার এবং কনফিগারেশনকে সহজ করে তোলে।

Hibernate Annotations এর ধারণা

Hibernate Annotations ব্যবহার করে, আপনি Java classes এবং Java fields এর উপর অ্যানোটেশন প্রয়োগ করতে পারেন, যা Hibernate কে নির্দেশ দেয় কিভাবে ডেটাবেস টেবিল এবং কলামের সাথে সেই ক্লাস এবং ফিল্ডগুলির সম্পর্ক হবে।

এই অ্যানোটেশনগুলি ডেটাবেস টেবিলের নাম, প্রাইমারি কী, ফরেন কী, এবং অন্যান্য সম্পর্ক (One-to-One, One-to-Many, Many-to-Many) নির্ধারণ করতে ব্যবহৃত হয়। Hibernate annotations JPA (Java Persistence API) স্পেসিফিকেশন অনুযায়ী কাজ করে, যার মানে হল যে আপনি JPA annotations ব্যবহার করতে পারেন যা Hibernate এর সাথে কাজ করে।

Hibernate Annotations কেন প্রয়োজন?

  1. Code Simplicity (কোডের সরলতা):
    • Hibernate annotations ব্যবহারের মাধ্যমে XML কনফিগারেশন ফাইলগুলি এড়িয়ে সরাসরি কোডের মধ্যে mapping করা যায়, যা কোডের রিডেবিলিটি এবং মেইন্টেনেবিলিটি উন্নত করে। এতে কোড কমপ্লেক্সিটি কমে যায় এবং কোডটি আরও পরিষ্কার হয়।
  2. Cleaner and More Readable Code (পরিষ্কার এবং আরও পাঠযোগ্য কোড):
    • XML কনফিগারেশন থেকে মুক্তি পেয়ে, আপনি ডেটাবেসের সাথে সম্পর্কযুক্ত প্রপার্টিগুলি সরাসরি Java কোডে নির্ধারণ করতে পারেন। এটি কোডকে আরও modular এবং maintainable করে তোলে।
  3. Less Configuration Overhead (কম কনফিগারেশন ওভারহেড):
    • XML কনফিগারেশনের পরিবর্তে অ্যানোটেশন ব্যবহার করে, কোডের মধ্যে সরাসরি mapping এবং configuration করা যায়, যা অতিরিক্ত কনফিগারেশন ফাইলের প্রয়োজনীয়তা কমিয়ে দেয়।
  4. Improved Developer Productivity (ডেভেলপার প্রোডাক্টিভিটি বৃদ্ধি):
    • অ্যানোটেশন ব্যবহারের মাধ্যমে ডেভেলপাররা দ্রুত কাজ করতে পারে এবং Hibernate টেবিল এবং ক্লাসের মধ্যে সম্পর্ক সহজেই নির্ধারণ করতে পারে। এইভাবে দ্রুত ডেটাবেস সম্পর্ক তৈরি এবং পরিবর্তন করা সম্ভব হয়।
  5. JPA Compatibility (JPA কমপ্যাটিবিলিটি):
    • Hibernate annotations JPA annotations এর সাথে পুরোপুরি সামঞ্জস্যপূর্ণ, যার ফলে আপনি একই কোড বা ক্লাস অন্যান্য JPA কনটেইনারের সাথে ব্যবহার করতে পারেন।

Hibernate Annotations এর ধরন এবং ব্যবহার

Hibernate Annotations বিভিন্ন ধরনের অ্যানোটেশন প্রদান করে, যা বিভিন্ন ডেটাবেস সম্পর্ক এবং অ্যাট্রিবিউট কনফিগার করতে সাহায্য করে।

1. @Entity

এটি একটি Java class কে Hibernate entity হিসাবে চিহ্নিত করে। একটি @Entity ক্লাস Hibernate কে জানায় যে এটি একটি টেবিলের সাথে সম্পর্কিত এবং এটি ডেটাবেসের persistent object

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class User {

    @Id
    private int id;
    private String name;

    // Getters and Setters
}

এখানে, @Entity অ্যানোটেশন User ক্লাসকে ডেটাবেস টেবিলের সাথে সম্পর্কিত একটি Java entity হিসাবে চিহ্নিত করছে।

2. @Table

এটি একটি Java class কে ডেটাবেস টেবিলের সাথে ম্যাপ করার জন্য ব্যবহৃত হয়। @Table অ্যানোটেশনটি টেবিলের নাম নির্ধারণ করতে ব্যবহৃত হয়। এটি ঐচ্ছিক (optional), তবে আপনি যদি টেবিলের নাম কাস্টমাইজ করতে চান, তাহলে এটি ব্যবহার করতে হবে।

import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Id;

@Entity
@Table(name = "user_table")
public class User {

    @Id
    private int id;
    private String name;

    // Getters and Setters
}

এখানে, @Table(name = "user_table") টেবিলের নাম user_table নির্ধারণ করে, যা ডেটাবেসে সংরক্ষিত হবে।

3. @Id

এটি একটি primary key ফিল্ডের জন্য ব্যবহৃত হয়। Hibernate এই ফিল্ডকে ডেটাবেস টেবিলের প্রাইমারি কী (primary key) হিসেবে চিহ্নিত করে।

@Id
private int id;

এখানে, id ফিল্ডটিকে প্রাইমারি কী হিসেবে চিহ্নিত করা হয়েছে।

4. @GeneratedValue

এটি primary key ফিল্ডের মান স্বয়ংক্রিয়ভাবে জেনারেট করার জন্য ব্যবহৃত হয়। এটি সাধারণত auto-increment টাইপের প্রাইমারি কী ফিল্ডে ব্যবহৃত হয়।

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

এখানে, @GeneratedValue(strategy = GenerationType.IDENTITY) Hibernate কে বলে যে id ফিল্ডের মান স্বয়ংক্রিয়ভাবে বৃদ্ধি হবে (যেমন auto-increment)।

5. @Column

এই অ্যানোটেশনটি Java fields এবং ডেটাবেস টেবিলের কলামগুলির মধ্যে সম্পর্ক তৈরি করে। আপনি টেবিলের কলামের নাম এবং অন্যান্য বৈশিষ্ট্য কাস্টমাইজ করতে এটি ব্যবহার করতে পারেন।

@Column(name = "user_name", length = 50, nullable = false)
private String name;

এখানে, @Column(name = "user_name") name ফিল্ডটি ডেটাবেস টেবিলের user_name কলামের সাথে ম্যাপ করছে।

6. @OneToMany, @ManyToOne, @ManyToMany, @OneToOne

এগুলি সম্পর্কিত অ্যানোটেশন, যেগুলি one-to-many, many-to-one, many-to-many, এবং one-to-one সম্পর্কের জন্য ব্যবহৃত হয়।

One-to-Many উদাহরণ:

@OneToMany(mappedBy = "department")
private List<Employee> employees;

এখানে, @OneToMany অ্যানোটেশনটি Department ক্লাসের employees প্রপার্টি সম্পর্কিত Employee ক্লাসের সাথে একাধিক Employee অবজেক্টের সম্পর্ক চিহ্নিত করছে।

7. @Transient

এই অ্যানোটেশনটি একটি ফিল্ডকে Hibernate থেকে সংরক্ষণ না করার জন্য ব্যবহৃত হয়। অর্থাৎ, এই ফিল্ডটি ডেটাবেসে কখনই সেভ হবে না।

@Transient
private String temporaryData;

এখানে, temporaryData ফিল্ডটি Hibernate ক্যাশ বা ডেটাবেসে সংরক্ষিত হবে না।


Hibernate Annotations এর সুবিধা

  1. কমপ্লেক্স কনফিগারেশন কমানো:
    • Hibernate annotations ব্যবহার করে XML কনফিগারেশন ফাইল থেকে মুক্তি পাওয়া যায়, এবং কোডের মধ্যেই ম্যাপিং ও কনফিগারেশন করা যায়।
  2. সহজ রিডেবল কোড:
    • Hibernate annotations ব্যবহার করার মাধ্যমে কোড সহজে পড়া যায়, কারণ সম্পর্কগুলি সরাসরি ক্লাস এবং ফিল্ডে অ্যানোটেশন হিসেবে থাকে।
  3. অন্য JPA কনটেইনারের সাথে সামঞ্জস্যপূর্ণ:
    • Hibernate JPA (Java Persistence API) এর অংশ, এবং এটি JPA annotations এর সাথে পুরোপুরি সামঞ্জস্যপূর্ণ।
  4. ডেটাবেস সম্পর্ক আরও কার্যকরীভাবে মডেল করা:
    • Hibernate annotations ব্যবহার করে আপনি খুব সহজেই একাধিক ধরনের ডেটাবেস সম্পর্ক (যেমন One-to-One, One-to-Many) কোডের মধ্যে মডেল করতে পারেন।

Hibernate Annotations Hibernate ORM ফ্রেমওয়ার্কের জন্য অত্যন্ত শক্তিশালী একটি বৈশিষ্ট্য। এটি Java ক্লাসের মধ্যে সরাসরি metadata নির্ধারণ করতে সহায়তা করে, যা Hibernate কে জানায় কিভাবে ক্লাস এবং ডেটাবেস টেবিলের মধ্যে সম্পর্ক স্থাপন করতে হবে। Annotations ব্যবহার করার ফলে কোড আরও পরিষ্কার, সহজ, এবং মেইন্টেনেবল হয়ে ওঠে, এবং এতে XML কনফিগারেশনের প্রয়োজনীয়তা কমে যায়। Hibernate annotations আপনাকে আপনার ডেটাবেস টেবিলের সাথে Java objects সম্পর্কিত করতে সহজ এবং দ্রুত উপায় প্রদান করে।

Content added By

@Entity, @Table, @Id, @GeneratedValue এর ব্যবহার

139
139

Hibernate, একটি Object-Relational Mapping (ORM) ফ্রেমওয়ার্ক, Java objects এবং relational database tables এর মধ্যে সম্পর্ক স্থাপন করতে সাহায্য করে। Hibernate এ Entity Classes এবং তাদের table mappings তৈরি করার জন্য বিভিন্ন annotations ব্যবহার করা হয়। এর মধ্যে সবচেয়ে গুরুত্বপূর্ণ @Entity, @Table, @Id, এবং @GeneratedValue। এই অ্যানোটেশনগুলি ডেটাবেস টেবিলের সাথে Java objects এর সম্পর্ক স্থাপন করতে ব্যবহৃত হয়।

এখানে আমরা এই অ্যানোটেশনগুলি কীভাবে ব্যবহার করতে হয় তা ব্যাখ্যা করব।


1. @Entity Annotation

@Entity অ্যানোটেশনটি Hibernate কে বলে যে এই ক্লাসটি একটি Entity এবং এটি ডেটাবেসের টেবিলের সাথে সম্পর্কিত। এই অ্যানোটেশনটি ব্যবহার না করলে Hibernate ওই ক্লাসটিকে Entity হিসেবে চিনবে না।

ব্যবহার:

import javax.persistence.*;

@Entity
public class Employee {
    // Class definition
}

এখানে, @Entity অ্যানোটেশনটি Hibernate কে জানায় যে Employee ক্লাসটি একটি Entity এবং এটি ডেটাবেস টেবিলের সাথে সম্পর্কিত হবে।


2. @Table Annotation

@Table অ্যানোটেশনটি Hibernate কে বলে যে Entity ক্লাসটি কোন database table এর সাথে সম্পর্কিত হবে। এই অ্যানোটেশনটি সাধারণত @Entity অ্যানোটেশনের পরে ব্যবহৃত হয়, যদিও এটি optional (অপশনাল)।

ব্যবহার:

@Entity
@Table(name="employee")  // Maps the Employee class to the "employee" table
public class Employee {
    // Class definition
}

এখানে:

  • @Table(name="employee"): এটি Hibernate কে বলে যে Employee ক্লাসটি ডেটাবেসের employee টেবিলের সাথে সম্পর্কিত।

যদি আপনি @Table ব্যবহার না করেন, তবে Hibernate স্বয়ংক্রিয়ভাবে Entity ক্লাসের নামটিকে টেবিলের নাম হিসেবে ব্যবহার করবে। উদাহরণস্বরূপ, Employee ক্লাসের জন্য Hibernate employee নামে একটি টেবিল তৈরি করবে।


3. @Id Annotation

@Id অ্যানোটেশনটি Hibernate কে বলে যে কোন ফিল্ডটি primary key হবে। এই ফিল্ডটির মানের মাধ্যমে Entity অবজেক্টটিকে শনাক্ত করা হয়।

ব্যবহার:

@Entity
@Table(name="employee")
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    private int id;

    @Column(name="name")
    private String name;

    @Column(name="salary")
    private double salary;

    // Constructors, getters, and setters
}

এখানে:

  • @Id: এটি id ফিল্ডটিকে primary key হিসেবে চিহ্নিত করে।
  • @Column(name="id"): এটি ডেটাবেস টেবিলের কলাম নাম id কে Entity ক্লাসের id ফিল্ডের সাথে ম্যাপ করে।

@Id অ্যানোটেশন ছাড়া Hibernate কোনো ফিল্ডকে primary key হিসেবে চিনবে না।


4. @GeneratedValue Annotation

@GeneratedValue অ্যানোটেশনটি Hibernate কে বলে যে primary key এর মানটি স্বয়ংক্রিয়ভাবে তৈরি করা হবে (auto-generated)। সাধারণত, এটি @Id অ্যানোটেশনের সাথে ব্যবহৃত হয় এবং এটি সাধারণত auto-increment বা sequence (ডাটাবেস ডায়ালেক্ট অনুযায়ী) এর মাধ্যমে কাজ করে।

ব্যবহার:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)  // Auto-generate the primary key value
@Column(name="id")
private int id;

এখানে:

  • @GeneratedValue(strategy = GenerationType.IDENTITY): এই স্ট্র্যাটেজি Hibernate কে বলে যে primary key ফিল্ডটি auto-increment হিসেবে পরিচালিত হবে (যেমন MySQL বা H2-এ)। এটি সাধারণত IDENTITY বা SEQUENCE এর মাধ্যমে কাজ করে, ডাটাবেস ড্রাইভার অনুযায়ী।

@GeneratedValue এর আরও কিছু স্ট্র্যাটেজি আছে:

  • GenerationType.AUTO: Hibernate ডেটাবেসের উপর নির্ভর করে সঠিক স্ট্র্যাটেজি নির্বাচন করবে।
  • GenerationType.IDENTITY: ডেটাবেসের auto-increment ফিচার ব্যবহার করবে (যেমন MySQL বা PostgreSQL)।
  • GenerationType.SEQUENCE: ডেটাবেসের sequence ব্যবহার করবে (যেমন Oracle বা PostgreSQL)।
  • GenerationType.TABLE: Hibernate টেবিলের মাধ্যমে কাস্টম primary key generation মেকানিজম ব্যবহৃত হবে।

Complete Example: @Entity, @Table, @Id, @GeneratedValue

এখানে একটি সম্পূর্ণ উদাহরণ দেওয়া হলো, যেখানে Employee Entity ক্লাস তৈরি করা হয়েছে এবং বিভিন্ন Hibernate অ্যানোটেশন ব্যবহার করা হয়েছে।

import javax.persistence.*;

@Entity
@Table(name="employee")  // Mapping the entity to the "employee" table
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)  // Auto-generate the primary key
    @Column(name="id")
    private int id;

    @Column(name="name")
    private String name;

    @Column(name="salary")
    private double salary;

    // Constructors, getters, and setters
    public Employee() {}

    public Employee(String name, double salary) {
        this.name = name;
        this.salary = salary;
    }

    // Getters and Setters
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
}

Hibernate Configuration (hibernate.cfg.xml)

<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- JDBC connection settings -->
        <property name="hibernate.connection.driver_class">org.h2.Driver</property>
        <property name="hibernate.connection.url">jdbc:h2:mem:testdb</property>
        <property name="hibernate.connection.username">sa</property>
        <property name="hibernate.connection.password"></property>

        <!-- Hibernate Dialect -->
        <property name="hibernate.dialect">org.hibernate.dialect.H2Dialect</property>

        <!-- Show SQL queries -->
        <property name="hibernate.show_sql">true</property>

        <!-- Hibernate HBM2DDL -->
        <property name="hibernate.hbm2ddl.auto">update</property>
    </session-factory>
</hibernate-configuration>

Main Program: Hibernate CRUD Operations

import org.hibernate.*;
import org.hibernate.cfg.Configuration;

public class MainApp {
    public static void main(String[] args) {

        // Create SessionFactory and Session
        SessionFactory factory = new Configuration().configure("hibernate.cfg.xml")
                .addAnnotatedClass(Employee.class)
                .buildSessionFactory();

        Session session = factory.getCurrentSession();

        try {
            // Create new Employee object
            Employee employee = new Employee("John Doe", 50000);

            // Start a transaction
            session.beginTransaction();

            // Save the employee object
            session.save(employee);

            // Commit the transaction
            session.getTransaction().commit();

            // Retrieve the employee based on the id
            session = factory.getCurrentSession();
            session.beginTransaction();

            Employee retrievedEmployee = session.get(Employee.class, employee.getId());
            System.out.println("Retrieved Employee: " + retrievedEmployee.getName());

            // Commit the transaction
            session.getTransaction().commit();
        } finally {
            factory.close();
        }
    }
}

Hibernate-এ @Entity, @Table, @Id, এবং @GeneratedValue অ্যানোটেশনগুলি মূল ভূমিকা পালন করে যখন Java objects এবং relational database tables এর মধ্যে সম্পর্ক তৈরি করা হয়। এই অ্যানোটেশনগুলির মাধ্যমে আপনি Java classes কে database tables এর সাথে সংযুক্ত করতে পারেন এবং ডেটাবেস অপারেশনগুলো অবজেক্ট-ওরিয়েন্টেড পদ্ধতিতে পরিচালনা করতে পারেন। Hibernate ORM এর মাধ্যমে primary key generation, entity mappings, এবং database schema সহজে পরিচালনা করা যায়।

Content added By

@OneToOne, @OneToMany, @ManyToOne, এবং @ManyToMany

137
137

Hibernate হল একটি ORM (Object-Relational Mapping) ফ্রেমওয়ার্ক যা ডেটাবেস টেবিলগুলির মধ্যে সম্পর্ক পরিচালনা করার জন্য annotations এবং entity mappings ব্যবহার করে। Hibernate এর মাধ্যমে entity relationships যেমন @OneToOne, @OneToMany, @ManyToOne, এবং @ManyToMany সম্পর্কগুলি খুব সহজে নির্ধারণ করা যেতে পারে।

এগুলি হল Hibernate এর কিছু গুরুত্বপূর্ণ অ্যাসোসিয়েশন অ্যানোটেশন যা object-oriented রিলেশন তৈরি করতে সাহায্য করে। এখানে আমরা প্রতিটি সম্পর্কের ব্যাখ্যা এবং উদাহরণ দেখব।


1. @OneToOne Relationship

@OneToOne সম্পর্ক তখন ব্যবহার হয় যখন একটি entity অন্য একটি entity এর সাথে একে অপরের সাথে একক সম্পর্ক স্থাপন করে। এই সম্পর্কটি primary key এর মাধ্যমে foreign key সম্পর্ক তৈরি করে। উদাহরণস্বরূপ, একজন ব্যক্তি একাধিক ব্যক্তিগত অ্যাড্রেসের পরিবর্তে একটি একক অ্যাড্রেস পেতে পারে।

@OneToOne উদাহরণ:

Person.java (One-to-One):

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;

@Entity
public class Person {

    @Id
    private int id;
    private String name;

    @OneToOne
    private Address address;

    // Constructors, getters, and setters
    public Person() {}

    public Person(int id, String name, Address address) {
        this.id = id;
        this.name = name;
        this.address = address;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    // Other getters and setters
}

Address.java (One-to-One):

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Address {

    @Id
    private int id;
    private String street;

    // Constructors, getters, and setters
    public Address() {}

    public Address(int id, String street) {
        this.id = id;
        this.street = street;
    }

    // Getters and setters
}

ব্যাখ্যা:

  • @OneToOne: Person এবং Address এর মধ্যে একে অপরের সাথে একক সম্পর্ক স্থাপন করা হয়েছে।
  • Person Entity ক্লাসের মধ্যে একটি Address অবজেক্ট রয়েছে, যা একটি একক Address এর সাথে সম্পর্কিত।

2. @OneToMany Relationship

@OneToMany সম্পর্ক তখন ব্যবহার হয় যখন একটি entity একাধিক entity এর সাথে সম্পর্কিত থাকে। এই সম্পর্কটি ডেটাবেসের one-to-many রিলেশন তৈরি করে। উদাহরণস্বরূপ, একজন Author একাধিক Book এর সাথে সম্পর্কিত হতে পারে।

@OneToMany উদাহরণ:

Author.java (One-to-Many):

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import java.util.Set;

@Entity
public class Author {

    @Id
    private int id;
    private String name;

    @OneToMany(mappedBy = "author")
    private Set<Book> books;

    // Constructors, getters, and setters
    public Author() {}

    public Author(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public Set<Book> getBooks() {
        return books;
    }

    public void setBooks(Set<Book> books) {
        this.books = books;
    }

    // Other getters and setters
}

Book.java (Many-to-One):

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

@Entity
public class Book {

    @Id
    private int id;
    private String title;

    @ManyToOne
    private Author author;

    // Constructors, getters, and setters
    public Book() {}

    public Book(int id, String title, Author author) {
        this.id = id;
        this.title = title;
        this.author = author;
    }

    // Other getters and setters
}

ব্যাখ্যা:

  • @OneToMany: Author Entity ক্লাসে One-to-Many সম্পর্ক স্থাপন করা হয়েছে, যেখানে এক Author এর একাধিক Book থাকতে পারে।
  • mappedBy: mappedBy = "author" এই অ্যানোটেশনটি নির্দেশ করে যে, Book Entity ক্লাসে author ফিল্ডটির মাধ্যমে এই সম্পর্কটি পরিচালিত হবে।

3. @ManyToOne Relationship

@ManyToOne সম্পর্ক তখন ব্যবহার হয় যখন অনেকগুলি entity একটি entity এর সাথে সম্পর্কিত থাকে। এটি one-to-many সম্পর্কের বিপরীত এবং একটি entity এর প্রতি একাধিক entity সম্পর্কিত থাকতে পারে।

@ManyToOne উদাহরণ:

এটি পূর্বের Book এবং Author উদাহরণের অংশ।

Book.java (Many-to-One):

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

@Entity
public class Book {

    @Id
    private int id;
    private String title;

    @ManyToOne
    private Author author;

    // Constructors, getters, and setters
    public Book() {}

    public Book(int id, String title, Author author) {
        this.id = id;
        this.title = title;
        this.author = author;
    }

    public Author getAuthor() {
        return author;
    }

    public void setAuthor(Author author) {
        this.author = author;
    }

    // Other getters and setters
}

ব্যাখ্যা:

  • @ManyToOne: এখানে, Book Entity-এ Many-to-One সম্পর্কটি Author Entity এর সাথে তৈরি করা হয়েছে।
  • একাধিক Book একই Author এর সাথে সম্পর্কিত থাকতে পারে।

4. @ManyToMany Relationship

@ManyToMany সম্পর্ক তখন ব্যবহার হয় যখন একটি entity অন্য একাধিক entity এর সাথে সম্পর্কিত থাকে এবং সেই সম্পর্ক উভয় দিক থেকে একাধিক হতে পারে। এটি একটি many-to-many সম্পর্ক তৈরি করে, যেখানে একটি entity এর একাধিক রেকর্ড অনেক অন্য entity এর রেকর্ডের সাথে সম্পর্কিত হতে পারে।

@ManyToMany উদাহরণ:

Student.java (Many-to-Many):

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import java.util.Set;

@Entity
public class Student {

    @Id
    private int id;
    private String name;

    @ManyToMany
    private Set<Course> courses;

    // Constructors, getters, and setters
    public Student() {}

    public Student(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public Set<Course> getCourses() {
        return courses;
    }

    public void setCourses(Set<Course> courses) {
        this.courses = courses;
    }

    // Other getters and setters
}

Course.java (Many-to-Many):

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import java.util.Set;

@Entity
public class Course {

    @Id
    private int id;
    private String title;

    @ManyToMany(mappedBy = "courses")
    private Set<Student> students;

    // Constructors, getters, and setters
    public Course() {}

    public Course(int id, String title) {
        this.id = id;
        this.title = title;
    }

    public Set<Student> getStudents() {
        return students;
    }

    public void setStudents(Set<Student> students) {
        this.students = students;
    }

    // Other getters and setters
}

ব্যাখ্যা:

  • @ManyToMany: Student এবং Course এর মধ্যে একটি many-to-many সম্পর্ক তৈরি হয়েছে, যেখানে একাধিক Student একাধিক Course নিতে পারে এবং একাধিক Course একাধিক Student কে অন্তর্ভুক্ত করতে পারে।
  • mappedBy: mappedBy = "courses" এই অ্যানোটেশনটি বলে দেয় যে Course Entity এর মধ্যে Student এর সম্পর্কটি পরিচালিত হবে।

Summary of Associations in Hibernate

Association TypeExplanationAnnotations Used
One-to-OneA single entity is associated with another single entity.@OneToOne
One-to-ManyA single entity is associated with multiple entities.@OneToMany, @ManyToOne
Many-to-OneMultiple entities are associated with a single entity.@ManyToOne
Many-to-ManyMultiple entities are associated with multiple other entities.@ManyToMany

Hibernate-এ One-to-One, One-to-Many, Many-to-One, এবং Many-to-Many অ্যাসোসিয়েশন অ্যানোটেশনগুলি বিভিন্ন ধরণের সম্পর্ক পরিচালনা করতে ব্যবহৃত হয়। Hibernate ORM এই সম্পর্কগুলিকে Java objects এবং database tables এর মধ্যে সম্পর্ক তৈরি করতে ব্যবহার করে, যা ডেটাবেসের সম্পর্কিত টেবিলের মধ্যে সঠিক ডেটা সঞ্চালনা সহজ করে তোলে।

Hibernate অ্যানোটেশনগুলির মাধ্যমে, আপনি সম্পর্কিত ডেটাবেস টেবিলগুলির মধ্যে mapping তৈরি করতে পারেন, যেমন foreign key, join table, এবং cascade operations সরাসরি ডিফাইন করা যায়।

Content added By

Hibernate Annotations এর মাধ্যমে Mapping

130
130

Hibernate ORM (Object-Relational Mapping) Java objects এবং relational database tables এর মধ্যে সম্পর্ক তৈরি করার একটি শক্তিশালী টুল। Hibernate ORM ব্যবহার করে, Java objects (POJOs) কে database tables এর সাথে সম্পর্কিত করতে annotations ব্যবহার করা যায়, যা XML configuration এর পরিবর্তে আরো সহজ এবং কম্প্যাক্টভাবে mapping পরিচালনা করতে সহায়ক।

Hibernate annotations আপনাকে Java classes এবং database tables এর মধ্যে সম্পর্ক স্থাপন করতে, primary key, column mapping, এবং associations (relationships) নির্ধারণ করতে সাহায্য করে।

Hibernate Annotations এর মাধ্যমে Mapping-এর মূল উপাদানগুলি

Hibernate-এ annotations ব্যবহার করে object-relational mapping কনফিগারেশন করা যেতে পারে, যেমন:

  1. @Entity: এই অ্যানোটেশনটি Hibernate কে জানায় যে এটি একটি entity এবং এটি ডেটাবেস টেবিলের সাথে সম্পর্কিত।
  2. @Table: এটি database table এর নাম সুনির্দিষ্ট করে দেয়, যা Entity ক্লাসের সাথে সম্পর্কিত।
  3. @Id: এটি টেবিলের primary key নির্ধারণ করে।
  4. @GeneratedValue: এটি primary key-এর auto-generation স্ট্রাটেজি নির্ধারণ করে।
  5. @Column: এটি ক্লাসের একটি ফিল্ডকে একটি column এর সাথে ম্যাপ করে।
  6. @OneToMany, @ManyToOne, @ManyToMany, @OneToOne: এই অ্যানোটেশনগুলি associations (relationship) ম্যাপ করতে ব্যবহৃত হয়।

Hibernate Annotations এর মাধ্যমে Mapping এর উদাহরণ

ধরা যাক, আমাদের একটি Employee এবং Department Entity Class রয়েছে, যেখানে One-to-Many relationship রয়েছে। এক Department একাধিক Employee এর সাথে সম্পর্কিত থাকতে পারে।

Step 1: Entity Class তৈরি করা

Employee Entity Class:
import javax.persistence.*;

@Entity
@Table(name = "employee")
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;

    @Column(name = "name")
    private String name;

    @Column(name = "salary")
    private double salary;

    @ManyToOne
    @JoinColumn(name = "department_id") // Foreign key column for the Department entity
    private Department department;

    public Employee() {}

    public Employee(String name, double salary) {
        this.name = name;
        this.salary = salary;
    }

    // Getters and setters
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    public Department getDepartment() {
        return department;
    }

    public void setDepartment(Department department) {
        this.department = department;
    }
}
Department Entity Class:
import javax.persistence.*;
import java.util.Set;

@Entity
@Table(name = "department")
public class Department {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;

    @Column(name = "name")
    private String name;

    @OneToMany(mappedBy = "department", cascade = CascadeType.ALL)
    private Set<Employee> employees;

    public Department() {}

    public Department(String name) {
        this.name = name;
    }

    // Getters and setters
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Set<Employee> getEmployees() {
        return employees;
    }

    public void setEmployees(Set<Employee> employees) {
        this.employees = employees;
    }
}

Step 2: Hibernate Configuration File

Hibernate কনফিগারেশন ফাইলে ডেটাবেস সংযোগ এবং entity class এর ম্যাপিং নির্ধারণ করতে হবে। নিচে একটি সাধারণ hibernate.cfg.xml কনফিগারেশন ফাইলের উদাহরণ দেওয়া হলো:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>

    <session-factory>
        <!-- JDBC connection settings -->
        <property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mydatabase</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">password</property>

        <!-- Hibernate dialect -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>

        <!-- Enable Hibernate's automatic session context management -->
        <property name="hibernate.current_session_context_class">thread</property>

        <!-- Enable batch processing -->
        <property name="hibernate.jdbc.batch_size">20</property>

        <!-- Enable second-level cache -->
        <property name="hibernate.cache.use_second_level_cache">true</property>

        <!-- Show SQL -->
        <property name="hibernate.show_sql">true</property>

        <property name="hibernate.hbm2ddl.auto">update</property>

        <!-- Mapping the entity classes -->
        <mapping class="com.example.model.Employee"/>
        <mapping class="com.example.model.Department"/>
    </session-factory>

</hibernate-configuration>

Step 3: Data Insertion with Hibernate

এখন, Hibernate ব্যবহার করে আমরা Employee এবং Department এর ইনস্ট্যান্স তৈরি এবং ডেটাবেসে সেভ করতে পারি।

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateApp {
    public static void main(String[] args) {
        // Create session factory
        SessionFactory factory = new Configuration().configure("hibernate.cfg.xml")
                                                  .addAnnotatedClass(Employee.class)
                                                  .addAnnotatedClass(Department.class)
                                                  .buildSessionFactory();
        
        // Create session
        Session session = factory.getCurrentSession();

        try {
            // Create new Department object
            Department department = new Department("IT");

            // Create new Employee objects
            Employee emp1 = new Employee("John Doe", 50000);
            Employee emp2 = new Employee("Jane Doe", 60000);

            // Set the department for each employee
            emp1.setDepartment(department);
            emp2.setDepartment(department);

            // Start a transaction
            session.beginTransaction();

            // Save the department (this will also save the employees because of CascadeType.ALL)
            session.save(department);

            // Commit the transaction
            session.getTransaction().commit();

            System.out.println("Saved department and employees successfully!");
        } finally {
            factory.close();
        }
    }
}

Explanation:

  1. @ManyToOne: Employee class-এ @ManyToOne অ্যানোটেশন ব্যবহার করা হয়েছে, যা Employee এবং Department এর মধ্যে Many-to-One সম্পর্ক স্থাপন করে। অর্থাৎ, এক Department একাধিক Employee এর সাথে সম্পর্কিত হতে পারে।
  2. @OneToMany: Department class-এ @OneToMany অ্যানোটেশন ব্যবহার করা হয়েছে, যা reverse সম্পর্ক বোঝায়। একটি Department এর একাধিক Employee থাকতে পারে, এবং এই সম্পর্কের জন্য mappedBy ব্যবহার করা হয় যাতে Hibernate জানাতে পারে যে, সম্পর্কটি কিভাবে পরিচালিত হবে (এখানে Employee class এর department প্রপার্টি দ্বারা)।
  3. CascadeType.ALL: এটি Employee অবজেক্টের উপর cascade অপারেশন কার্যকর করে, অর্থাৎ যখন Department সেভ হয়, তখন তার সাথে সম্পর্কিত Employees গুলি স্বয়ংক্রিয়ভাবে সেভ হয়ে যাবে।

Step 4: HQL Query with Mapping

এখন, HQL (Hibernate Query Language) ব্যবহার করে, আপনি Department এবং Employee সম্পর্কিত ডেটা রিট্রিভ করতে পারেন। উদাহরণস্বরূপ:

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;

import java.util.List;

public class HibernateApp {
    public static void main(String[] args) {
        // Create session factory
        SessionFactory factory = new Configuration().configure("hibernate.cfg.xml")
                                                  .addAnnotatedClass(Employee.class)
                                                  .addAnnotatedClass(Department.class)
                                                  .buildSessionFactory();
        
        // Create session
        Session session = factory.getCurrentSession();

        try {
            // Start a transaction
            session.beginTransaction();

            // HQL query to get all employees in the "IT" department
            Query<Employee> query = session.createQuery("from Employee e where e.department.name='IT'", Employee.class);

            // Execute the query and get the result list
            List<Employee> employees = query.getResultList();

            // Display the employees
            for (Employee emp : employees) {
                System.out.println(emp.getName() + "

works in the " + emp.getDepartment().getName() + " department"); }

        // Commit the transaction
        session.getTransaction().commit();
    } finally {
        factory.close();
    }
}

}


---

### **Conclusion**

- Hibernate Annotations ব্যবহার করে **Entity Classes** এবং **database tables** এর মধ্যে সম্পর্ক স্থাপন করা সহজ এবং কার্যকর। 
- **One-to-Many** সম্পর্ক তৈরি করার জন্য **`@OneToMany`** এবং **`@ManyToOne`** অ্যানোটেশনগুলি ব্যবহার করা হয়, যা Java objects এবং ডেটাবেস টেবিলের মধ্যে সম্পর্ক সঠিকভাবে ম্যাপ করে।
- Hibernate এ **HQL (Hibernate Query Language)** ব্যবহার করে আপনি Entity ক্লাসের মধ্যে সম্পর্কিত ডেটা সহজে রিট্রিভ করতে পারেন এবং ডেটাবেসের সাথে যোগাযোগ করতে পারেন।
Content added By
Promotion